1.3 归纳总结 思维拓展
归纳总结
本章的重点是分析程序的时间复杂度。一定要掌握分析时间复杂度的方法和步骤, 很多读者在做题时一眼就能看出程序的时间复杂度, 但就是无法规范地表述其推导过程。为此, 编者查阅众多资料, 总结出了此类题型的两种形式, 供大家参考。
1. 循环主体中的变量参与循环条件的判断
在用于递推实现的算法中,首先找出基本运算的执行次数
例1:
c
int i =1;
while(i<n)
i=i*2;
例2:
c
int y = 5;
while((y+1)*(y+1)<n)
y=y+1;
在例 1 中,设基本运算 i = i * 2
的执行次数为
在例 2 中,设基本运算 y=y+1
的执行次数为
2. 循环主体中的变量与循环条件无关
此类题可采用数学归纳法或直接累计循环次数。多层循环时从内到外分析, 忽略单步语句、 条件判断语句, 只关注主体语句的执行次数。此类问题又可分为递归程序和非递归程序:
- 递归程序一般使用公式进行递推。时间复杂度的分析如下:
即
- 非递归程序的分析比较简单, 可以直接累计次数。本节前面给出了相关的习题。
思维拓展
求解斐波那契数列
有两种常用的算法: 递归算法和非递归算法。试分别分析两种算法的时间复杂度 (提示: 请结合归纳总结中的两种方法进行解答)。